Su vysledky tychto SQL prikazov rovnake ?
Otázka od: Roland Turcan
20. 9. 2002 14:50
Hello Delphi CZ konferencia!
1.
SELECT * FROM POKLADNA
WHERE JEDIN IN (SELECT RECORD_ID FROM SYS$REP
WHERE TABULKA='POKLADNA' AND
ZMENA<>'D' AND
JEDIN>40000
);
2.
select *
from pokladna a
join sys$rep b on b.record_id=a.jedin
and b.tabulka='POKLADNA' and b.ZMENA<>'D'
and b.JEDIN>40000;
Co vy na to ?
--
Best regards, TRoland
http://www.rotursoft.sk
Odpovedá: Roland Turcan
21. 9. 2002 10:21
<<< 21. 9. 2002 10:07 - Ondrej Kelle "O.Kelle@digitalpublishing.de" >>>
>> 1.
>>
>> SELECT * FROM POKLADNA
>> WHERE JEDIN IN (SELECT RECORD_ID FROM SYS$REP
>> WHERE TABULKA='POKLADNA' AND
>> ZMENA<>'D' AND
>> JEDIN>40000
>> );
>>
>>
>> 2.
>>
>> select *
>> from pokladna a
>> join sys$rep b on b.record_id=a.jedin
>> and b.tabulka='POKLADNA' and b.ZMENA<>'D'
>> and b.JEDIN>40000;
OK> Urcite to nebudu rovnake vysledky, pretoze 1. * vracia vsetky stlpce z
OK> tabulky POKLADNA, a 2. * vracia vsetky stlpce z celeho joinu.
OK> Okrem toho, (ak som to pochopil spravne) 1. vrati result set, v ktorom bude
OK> pre kazdu hodnotu POKLADNA.JEDIN (ak splna dane kriteria) prave jeden
OK> riadok.
OK> 2. (left inner join) vrati result set, kde pre kazdu hodnotu POKLADNA.JEDIN
OK> moze byt jeden alebo viac riadkov splnajucich dane kriteria.
Ano, ano celu noc som programoval vo sne a prisnilo sa mi
ze toto je moje riesenie:
SELECT DISTINCT A.*
FROM KURZ_LIST A
JOIN SYS$REP B ON A.JEDIN=B.RECORD_ID AND B.TABULKA='KURZ_LIST' AND
B.ZMENA<>'D' AND B.JEDIN>5000
oproti tomu prvemu to kleslo z 8.5s na 200ms. To je uz papanek
rozdiel. Mal som stale ten pocit, ze to druhe riesenie nie je to prave
orechove a fakt moja intuicia sa zase potvrdila. Aj napriek tomu
dakujem.
--
Best regards, TRoland
http://www.rotursoft.sk
Odpovedá: Lebeda David
20. 9. 2002 15:55
>
> SELECT * FROM POKLADNA
> WHERE JEDIN IN (SELECT RECORD_ID FROM SYS$REP
> WHERE TABULKA='POKLADNA' AND
> ZMENA<>'D' AND
> JEDIN>40000
> );
>
>
> 2.
>
> select *
> from pokladna a
> join sys$rep b on b.record_id=a.jedin
> and b.tabulka='POKLADNA' and b.ZMENA<>'D'
> and b.JEDIN>40000;
>
>
> Co vy na to ?
Ahoj,
Zalezi na tom. Pokud muze nastat situace, ze subselect vrati vice zaznamu se
stejnym RECORD_ID, vrati join vice radku nez priklad se subselectem.
Aspon se mi to tak zda na prvni letmy pohled.
David Lebeda
Odpovedá: Ondrej Kelle
20. 9. 2002 16:37
> 1.
>
> SELECT * FROM POKLADNA
> WHERE JEDIN IN (SELECT RECORD_ID FROM SYS$REP
> WHERE TABULKA='POKLADNA' AND
> ZMENA<>'D' AND
> JEDIN>40000
> );
>
>
> 2.
>
> select *
> from pokladna a
> join sys$rep b on b.record_id=a.jedin
> and b.tabulka='POKLADNA' and b.ZMENA<>'D'
> and b.JEDIN>40000;
Urcite to nebudu rovnake vysledky, pretoze 1. * vracia vsetky stlpce z
tabulky POKLADNA, a 2. * vracia vsetky stlpce z celeho joinu.
Okrem toho, (ak som to pochopil spravne) 1. vrati result set, v ktorom bude
pre kazdu hodnotu POKLADNA.JEDIN (ak splna dane kriteria) prave jeden
riadok.
2. (left inner join) vrati result set, kde pre kazdu hodnotu POKLADNA.JEDIN
moze byt jeden alebo viac riadkov splnajucich dane kriteria.
HTH
TOndrej